#include <cstring>
#include <vector>
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
     *
     * 该数组最长严格上升子序列的长度
     * @param a int整型vector 给定的数组
     * @return int整型
     */
    int LIS(vector<int>& a) {
        int n=a.size();
        if(n==0) return 0;
       vector<int>dp(n,1);
        int ret=1;
        for(int i=1;i<n;i++)
        {
            for(int j=0;j<i;j++)
            {
                if(a[j]<a[i])
                {
                    dp[i]=max(dp[i],dp[j]+1);
                }
            }
            ret=max(ret,dp[i]);
        }
        return ret;
    }
};




#include <cstring>
#include <vector>
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
     *
     * 该数组最长严格上升子序列的长度
     * @param a int整型vector 给定的数组
     * @return int整型
     */
    int LIS(vector<int>& a) 
    {
        int n=a.size();
        if(n==0) return 0;
        int len=1;
        int lens[n+1];lens[1]=a[0];
        for(int i=1;i<n;i++)
        {
            int left=1,right=len,ans=-1;
            while(left<=right)
            {
                int mid=(right-left)/2+left;
                if(lens[mid]>=a[i])
                {
                    ans=mid;
                    right=mid-1;
                }
                else left=mid+1;
            }
            if(ans==-1)
            {
                lens[++len]=a[i];
            }
            else {
                lens[ans]=a[i];
            }
        }
        return len;
    }
};